Портал открытых данных Правительства Москвы

https://data.mos.ru содержит более 100 тематичеcких наборов, многие из них с географичеcкой привязкой

Сайт портала открытых данных

Варианты получения данных

1. Напрямую с портала - xlsx, json, xml

2. Через API - geojson

-Необходимо получить API на сайте https://apidata.mos.ru -формирование запроса (через браузер, через R…)

3. Утилита от Urbica

-установить Node.js: https://nodejs.org/

-установить утилиту, выполнив npm install -g datamos-geojson в командной строке

-запустить утилиту, выполнив datamos-geojson в командной строке

Как сформировать ссылку на данные, используя API

2. Актуальная версия, обрезанная по ограничивающему контуру (bbox)

http://api.data.mos.ru/v1/datasets/{DatasetId}/features?bbox={bbox}&api_key={КЛЮЧ_API}

Определяем ID датасета и ключ API

datasetId = "1193" #номер датасета, можно узнать в паспорте

#version = "1" #номер версии (опционально)
    
#release = "59" #номер релиза (опционально)

api_key = "b0c0ad1adf1319a3a8b1c2ed7649b21e"  #уникальный ключ API

Получаем данные по ссылке

url = paste0("https://apidata.mos.ru/v1/datasets/", datasetId,"/features?api_key=",api_key) # формирование ссылки

data_sf = url %>% st_read() #создание пространственных данных из json

Cмотрим

mapview(data_sf)        

В одной из колонок хаос - непорядок ;)

Атрибуты определяем в разные столбцы

data_json = url %>% readr::read_file() %>% iconv("UTF-8")

data_json_edited = mgsub::mgsub(data_json, c('\\\"Attributes\\\":\\{', '\\}\\,\"type\":\"Feature\"\\}'), c('','\\,\"type\"\\:\"Feature\"\\}')) #удаляем Attributes как группу, которая содержит в себе множетсво разных характеристик 

data_sf2 = data_json_edited %>% sf::read_sf() #создание пространственных данных из json
                
glimpse(data_sf2)  #смотрим на стркутру получившегося файла
## Rows: 31
## Columns: 21
## $ DatasetId                   <int> 1193, 1193, 1193, 1193, 1193, 1193, 1193, …
## $ VersionNumber               <int> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, …
## $ ReleaseNumber               <int> 131, 131, 131, 131, 131, 131, 131, 131, 13…
## $ RowId                       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ FullName                    <chr> "Красногвардейская участковая ветеринарная…
## $ ShortName                   <chr> "Красногвардейская УВЛ СББЖ ЮАО г Москвы",…
## $ ChiefName                   <chr> "Васильев Сергей Михайлович", "Махновецкая…
## $ ChiefPosition               <chr> "Начальник Красногвардейской УВЛ СББЖ ЮАО"…
## $ INN                         <chr> "7708006274", "7708006274", "7713082400", …
## $ KPP                         <chr> "772501001", "772501001", "771401001", "77…
## $ OGRN                        <chr> "", "", "", "", "", "", "", "", "", "", ""…
## $ AdmArea                     <chr> "Южный административный округ", "Южный адм…
## $ District                    <chr> "район Царицыно", "Донской район", "Савёло…
## $ Address                     <chr> "город Москва, Каспийская улица, дом 40", …
## $ UNOM                        <chr> "3807027", "3807156", "2112412", "2112439"…
## $ PublicPhone                 <chr> "[ { \"is_deleted\": 0, \"PublicPhone\": \…
## $ WorkingHours                <chr> "[ { \"is_deleted\": 0, \"DayOfWeek\": \"п…
## $ ClarificationOfWorkingHours <chr> "", "", "", "", "", "", "", "", "", "", ""…
## $ Comments                    <chr> "Структурное подразделение СББЖ ЮАО ГБУ «М…
## $ global_id                   <int> 4712784, 4712786, 4712787, 4712788, 471278…
## $ geometry                    <POINT [°]> POINT (37.66389 55.61745), POINT (37…
mapview(data_sf2)  # смотрим на данные

Функция, с помощью которой сразу получаем готовый для работы набор данных

get_datamos = function(datasetId) {
  
url = paste0("https://apidata.mos.ru/v1/datasets/", datasetId,"/features?api_key=","b0c0ad1adf1319a3a8b1c2ed7649b21e")
  
data_json = url %>% readr::read_file() %>% iconv("UTF-8")

data_json_edited = mgsub::mgsub(data_json, c('\\\"Attributes\\\":\\{', '\\}\\,\"type\":\"Feature\"\\}'), c('','\\,\"type\"\\:\"Feature\"\\}')) #удаляем Attributes как группу, которая содержит в себе множетсво разных характеристик 

data_sf = data_json_edited %>% sf::read_sf()
 
return(data_sf)
}

Выбираем нужные датасеты

ids = c(890, 60623, 1387, 886, 60624, 885,  902, 1232, 629) #номера нужных нам датасетов

sets_names = c("Waterpools", "Tennis", "Climbing", "Football", "Gym", "Regby", "Equestrian", "Ice skating", "SportHalls") #их названия

Запрашиваем и ждём

#one_dataset = get_datamos(datasetId) # применение функции к одному любому датасету

datasets = lapply(ids, get_datamos) # применение функции get_datamos ко всем нужным нам датаестам 

names(datasets) <- sets_names # определение имен для всех элементов списка

Смотрим

# Создаем интерактивную карту с помощью tmap с возможностью переключения слоев

colors = c("aquamarine2","yellowgreen","lightskyblue3","maroon3","tan1") # цвета, чтобы было веселее

sport_data = 0
for (i in 1:length(datasets)) {
  sport_data = sport_data+ tm_shape(datasets[[i]]) + tm_bubbles(group = sets_names[i], size = 0.1, col = colors[i]) 
} 

tmap_mode("view") # интерактивный режим tmap

sport_data %>% tmap_leaflet() %>% leaflet::hideGroup(sets_names[-1]) # отображаем все данные на карте, используем leaflet для переключения слоев